/**
 * 根据指定的卡片模型删除整个树枝的数据
 * 
 * Created by wbx on 2022/06/06
 *
 * 输入参数:
 *   Card:       必需,     文本,            卡片名称
 *   Parent:     必需,     文本,            上级引用的名称
 *   Record:     可选,     对象,            要删除的记录对象, 至少要包含ID字段, 引用对象支持级联删除
 *   Records:    可选,     对象数组,        要批量删除的记录数组
 *   ID:         可选,     文本,            要删除的记录ID
 *   Safe:       可选,     布尔,            是否安全删除. 安全删除会检测所有引用, 避免误删正在被引用的数据
 *
 * 输出参数:
 *   true表示删除成功
 *
 *   Created by wbx on 2022/5/1
 */
(function ({ UID, Card, Parent, Record, Records, ID, Safe = false }, headers) {
  // 验证用户
  if (!UID) throw Error("未授权的访问");

  // 检查卡片访问控制表
  if (headers && A.setting('EnableCardACL')) {
    const acl = A.cache.get(`CardACL.${Card}`, () => {
      return A.db.execute('KERNEL', "SELECT * FROM KPFWKZ WHERE KPMC=?", [Card]).rows;
    }, 60); // 缓存60秒
    if (!acl.some(item => !!item.KFKS) && !A.job.JobEvent({
      Event: 'OnCheckPageACL',
      UID,
      PageIds: acl.filter(item => item.GLYM_ID).map(item => item.GLYM_ID),
    }, headers)) {
      throw Error("You are not authorized to access this card");
    }
  }

  const card = A.card[Card];
  const parent_field = card.引用[Parent].标识符;

  let ids = [];
  if (Record) {
    if (!Record.ID) throw Error("缺失ID属性");
    ids.push(Record.ID);
  }
  if (Records) {
    Records.forEach(Record => {
      if (!Record.ID) throw Error("缺失ID属性");
      ids.push(Record.ID);
    });
  }
  if (ID) {
    ids.push(ID);
  }

  // 递归扩展至叶子节点
  const childs = [];
  const loader = id => {
    let { rows } = A.db.execute(card.连接名称, `SELECT ID FROM ${card.标识符} WHERE ${parent_field}=?`, [id]);
    rows.forEach(r => {
      childs.push(r.ID);
      loader(r.ID);
    });
  };
  ids.forEach(id => loader(id));

  // 合并扩展的节点
  ids = ids.concat(childs);

  // 安全删除的检查
  if (Safe && !card.数据.删除标记) {
    // 查询所有引用方
    let { rows } = A.db.execute('KERNEL', "SELECT A.LJMC, A.MC KPMC, A.BSF KPBSF, B.BSF SJBSF FROM KP A, KPYY B WHERE A.ID=B.KP_ID AND B.MB_ID=?", [card.ID]);
    rows.forEach(row => {
      if (row.KPBSF === card.标识符 && row.SJBSF === parent_field) return;  // 忽略上级引用
      ids.forEach(id => {
        let result;
        try {
          let { rows: [res] } = A.db.execute(row.LJMC, `SELECT COUNT(*) N FROM ${row.KPBSF} WHERE ${row.SJBSF}=?`, [id]);
          result = res;
        }
        // 忽略不能连接的
        catch (e) { }
        if (result && result.N > 0) throw Error(`要删除的记录正在被[${row.KPMC}]使用`);
      });
    });
  }

  // 执行删除 (每批次1000条)
  do {
    const base_ticks = Date.now() * 1000;
    ids.splice(0, 1000).forEach((id, index) => {
      if (Safe && card.数据.删除标记) {
        card.save({ ID: id, 删除标记: base_ticks + index }, UID);
      } else {
        card.delete(id);
      }
    });
  } while (ids.length > 0)

  return true;
})